#include "../include/Admin_Operation.h"

// 班次判处函数
F_node *Id_Judge(F_list *list, int id)
{
    // 安全判断
    if (list == NULL)
    {
        ERRLOG("双向循环链表 为 NULL");
        return NULL;
    }
    if (list->next == NULL)
    {
        ERRLOG("双向循环链表 内 无数据");
        return NULL;
    }
    F_node *ptr = list->next;
    do
    {
        if (id == ptr->data.id)
            return ptr;
        ptr = ptr->next;
    } while (ptr != list->next);
    return NULL;
}

// 执行删除航班信息
void By_Id_Deleting_flight(F_list *list, int id)
{

    // 安全判断
    if (list == NULL)
    {
        ERRLOG("双向循环链表 为 NULL");
        return;
    }
    if (list->next == NULL)
    {
        ERRLOG("双向循环链表 内 无数据");
        return;
    }
    int pos = 1;
    F_node *ptr = list->next;
    do
    {
        if (id == ptr->data.id)
        {
            printf("查找到以下信息\n");
            printf("班次    机型        起点站  终点站  起飞时间    到达时间    飞行时间    票价  载客量  剩余座位  是否飞\n");
            printf("--------------------------------------------------------------------------------------------------\n");
            printf("%-6d", ptr->data.id);
            printf("%-15s", ptr->data.flighttype);
            printf("%-10s", ptr->data.startcity);
            printf("%-10s", ptr->data.arrivecity);
            printf("%02d:%02d\t", ptr->data.starttime[0], ptr->data.starttime[1]);
            printf("%02d:%02d\t    ", ptr->data.arrivetime[0], ptr->data.arrivetime[1]);
            printf("%-10s\t", ptr->data.flytime);
            printf("%-6d", ptr->data.value);
            printf("%-8d", ptr->data.maxNUM);
            printf("%-8d  ", ptr->data.leftbuyersa);
            printf("%c\n", ptr->data.whetherfly);
            D_List_delete(list, pos);
            puts("已成功删除改航班");
            puts("按回车键返回");
            getchar();
            Press_Enter_To_Continue();
            return;
        }
        ptr = ptr->next;
        pos++;
    } while (ptr != list->next);

    return;
}

// 删除航班信息
void Deleting_flight_infor(F_list *Flight_list, U_data log_data)
{
    system("clear"); // 清屏
    F_data data;
    // 输入要删除航班信息的班次
    puts("请输入被删航班信息的班次");
    scanf("%d", &data.id);
    while (Id_Judge(Flight_list, data.id) == NULL)
    {
        printf("id不存在,请重新输入航班id:\n");
        scanf("%d", &data.id);
    }
    By_Id_Deleting_flight(Flight_list, data.id);
    // 将更改后的航班信息写回本地
    D_List_file_print(Flight_list);
}

// 设定航班信息
void Set_flight_infor(F_list *Flight_list, U_data log_data)
{
    system("clear"); // 清屏
    F_data data;
    // 输入航班信息
    puts("请输入航班信息");
    puts("请输入班次:");
    scanf("%d", &data.id);
    while (Id_Judge(Flight_list, data.id) != NULL)
    {
        printf("id重复,请重新输入航班id:\n");
        scanf("%d", &data.id);
    }
    puts("请输入机型:");
    scanf("%s", data.flighttype);
    puts("请输入起点:");
    scanf("%s", data.startcity);
    puts("请输入终点:");
    scanf("%s", data.arrivecity);
    puts("请输入起飞时间:");
    scanf("%d:%d", &data.starttime[0], &data.starttime[1]);
    puts("请输入到达时间:");
    scanf("%d:%d", &data.arrivetime[0], &data.arrivetime[1]);
    puts("请输入飞行时间:");
    scanf("%s", data.flytime);
    puts("请输入票价:");
    scanf("%d", &data.value);
    puts("请输入核载量:");
    scanf("%d", &data.maxNUM);
    puts("请输入剩余座次:");
    scanf("%d", &data.leftbuyersa);
    puts("请输入是否起飞(输入y OR n):");
    getchar();
    scanf("%c", &data.whetherfly);
    // 确认航班信息
    puts("请确认航班信息");
    printf("班次    机型        起点站  终点站  起飞时间    到达时间    飞行时间    票价  载客量  剩余座位  是否飞\n");
    printf("--------------------------------------------------------------------------------------------------\n");
    printf("%-6d", data.id);
    printf("%-15s", data.flighttype);
    printf("%-10s", data.startcity);
    printf("%-10s", data.arrivecity);
    printf("%02d:%02d\t", data.starttime[0], data.starttime[1]);
    printf("%02d:%02d\t    ", data.arrivetime[0], data.arrivetime[1]);
    printf("%-10s\t", data.flytime);
    printf("%-6d", data.value);
    printf("%-8d", data.maxNUM);
    printf("%-8d  ", data.leftbuyersa);
    printf("%c\n", data.whetherfly);
    getchar();
    Press_Enter_To_Continue();
    // 将航班信息写入到文件
    D_List_insert(Flight_list, data, 1);
    D_List_file_print(Flight_list);
}

// 修改航班信息
void Modify_flight_infor(F_list *Flight_list, U_data log_data)
{
    system("clear");
    // // 从文件中重新读取航班信息
    // D_List_file_scanf(Flight_list);
    // 打印航班信息
    D_List_print(Flight_list);
    // 查找需要修改航班
    puts("1.按班次查找并修改  2.按起点城市查找并修改");
    switch (getchar())
    {
    case '1':
    {
        puts("请输入需要查找的班次");
        int num;
        scanf("%d", &num);
        system("clear");
        // 将查找的航班信息返回给ptr
        F_node *ptr = D_List_find_id(Flight_list, num);
        if (ptr == NULL)
        {
            printf("无该航班\n");
            setbuf(stdin, NULL);
            scanf("%*c");
            return;
        }
        puts("请重新输入你要修改的信息");
        puts("请输入班次:");
        scanf("%d", &ptr->data.id);

        while (Id_Judge(Flight_list, ptr->data.id) != NULL)
        {
            if (ptr->data.id == num)
            {
                break;
            }
            printf("id重复,请重新输入航班id:\n");
            scanf("%d", &ptr->data.id);
        }

        puts("请输入机型:");
        scanf("%s", ptr->data.flighttype);
        puts("请输入起点:");
        scanf("%s", ptr->data.startcity);
        puts("请输入终点:");
        scanf("%s", ptr->data.arrivecity);
        puts("请输入起飞时间:");
        scanf("%d:%d", &ptr->data.starttime[0], &ptr->data.starttime[1]);
        puts("请输入到达时间:");
        scanf("%d:%d", &ptr->data.arrivetime[0], &ptr->data.arrivetime[1]);
        puts("请输入飞行时间:");
        scanf("%s", ptr->data.flytime);
        puts("请输入票价:");
        scanf("%d", &ptr->data.value);
        puts("请输入核载量:");
        scanf("%d", &ptr->data.maxNUM);
        puts("请输入剩余座次:");
        scanf("%d", &ptr->data.leftbuyersa);
        puts("请输入是否起飞:");
        getchar();
        scanf("%c", &ptr->data.whetherfly);
        // 将航班信息重新写入到文件
        // D_List_insert(Flight_list, ptr->data, 1);
        D_List_file_print(Flight_list);
        system("cls");
        break;
    }
    case '2':
    {
        puts("请输入需要查找的起点城市");
        char name[20];
        scanf("%s", name);
        // 将查找的航班信息返回给ptr
        // F_node * ptr_1 = D_List_find_name(Flight_list, name);
    }
    break;
    default:
        printf("请输入合适的数字\n");
        break;
    }
}

// 通过名字查找到这个结点的数据，并返回
U_node *By_name_Judge_data(FlightSystem Flight_sys, char *name)
{
    // 在普通用户链表中查找输入的用户名
    U_node *ptr_1 = S_List_find_name(Flight_sys.REGULAR_USER, name);
    if (ptr_1 != NULL)
    {
        return ptr_1;
    }
    // 在银卡用户链表中查找输入的用户名
    U_node *ptr_2 = S_List_find_name(Flight_sys.SILVER_USER, name);
    if (ptr_2 != NULL)
    {
        return ptr_2;
    }
    // 在金卡用户链表中查找输入的用户名
    U_node *ptr_3 = S_List_find_name(Flight_sys.GOLD_USER, name);
    if (ptr_3 != NULL)
    {
        return ptr_3;
    }
    // 在金卡用户链表中查找输入的用户名
    U_node *ptr_4 = S_List_find_name(Flight_sys.PLATINUM_USER, name);
    if (ptr_4 != NULL)
    {
        return ptr_4;
    }
    return NULL;
}

// 如果用户的身份码变动，在原文件中将其删除，并写入新文件
void By_Grage_Judge_File(FlightSystem Flight_sys, U_node *new_ptr, int num)
{
    // 根据用户数据判断用户所属链表
    U_list *User_list = By_Data_Judge_List(Flight_sys, new_ptr->data);
    // 根据用户数据判断用户所属文件
    const char *User_File = By_User_Judge_File(new_ptr->data);
    // 判断身份码是否更改
    if (new_ptr->data.grade != num)
    {
        // 保存原来数据
        U_data new_data = new_ptr->data;
        // 按名字删除原结点
        S_List_name_delete(User_list, new_ptr->data.name);
        // 将更改后的数据写回本地
        S_List_File_print(User_list, User_File);

        // 身份码更改
        new_data.grade = num;
        // 根据用身份码判断用户所属链表
        U_list *new_list = By_Data_Judge_List(Flight_sys, new_data);
        // 根据身份码判断用户所属文件
        const char *new_File = By_User_Judge_File(new_data);
        // 将更改后的结点插入对应的用户链表中
        S_List_insert(new_list, new_data, 1);
        // 将更改后的文件写回本地
        S_List_File_print(new_list, new_File);
    }
}

// 修改普通用户信息
void Modify_user_infor(FlightSystem Flight_sys, U_data log_data)
{
    system("clear");
    // 请输入需要修改的用户名
    char name[128] = {0};
    puts("请输入需要修改的用户名");
    scanf("%s", name);
    // 通过数据确定是那一条，通过名字在这条表上面找到结点
    U_node *ptr = By_name_Judge_data(Flight_sys, name);
    if (NULL != ptr)
    {
        printf("查找到以下用户信息\n");
        printf("用户名:%s\t密码:%s\t身份码:%d\t余额:%d\n",
               ptr->data.name, ptr->data.passwd, ptr->data.grade, ptr->data.value);
        puts("请确认是否修改此用户");
        puts("1:确认    2:返回");
        getchar();
        switch (getchar())
        {
        case '1':
        {
            puts("请输入修改的信息");
            puts("用户名");
            char scanf_name[20];
            scanf("%s", scanf_name);
            while (By_name_Judge_data(Flight_sys, scanf_name)!=NULL)
            {
                if (strcmp(scanf_name,ptr->data.name)==0)
                {
                    break;
                }
                printf("该名字已被使用,请重新输入用户名User_Name:\n");
                scanf("%s", scanf_name);
                strcpy(scanf_name,ptr->data.name);
            }

            puts("密码");
            scanf("%s", ptr->data.passwd);
            puts("身份码");
            int num;
            scanf("%d", &num);
            puts("余额");
            scanf("%d", &ptr->data.value);
            By_Grage_Judge_File(Flight_sys, ptr, num);
            // S_List_File_print(list, File_name);
            getchar();
            printf("修改成功,按任意键返回");
            getchar();
        }
        break;
        default:
            break;
        }
    }
    else
    {
        puts("无此用户");
        getchar();
        getchar();
        return;
    }
}

// 增加超级用户
void Add_root(FlightSystem Flight_sys, U_data log_data)
{
    system("clear");
    U_data data;
    puts("请依次输入新增超级用户的信息");
    puts("用户名");
    scanf("%s", data.name);
    puts("密码");
    scanf("%s", data.passwd);
    puts("身份码");
    scanf("%d", &data.grade);
    puts("余额");
    scanf("%d", &data.value);
    S_List_insert(Flight_sys.ADMIN_USER, data, 1);
    S_List_File_print(Flight_sys.ADMIN_USER, ADMIN_FILE);
    getchar();
    printf("增加超级用户成功,请按任意键返回");
    getchar();
}
